<?php
/**
 * 用于安全检查的类
 * */

class mysafe{
	
	/**
	 * 设置为crontab模式
	 * */
	public static function setCron(){
		set_time_limit(0);;
		define('IN_CRONTAB',true);//只能在crontab下运行
	}
	
	/**
	 * 检查是否为crontab模式
	 * */
	public static function checkCron(){
		if(!defined('IN_CRONTAB') || !IN_CRONTAB) die('ONLY RUN IN CRONTAB'); //限制这个脚本只能在crontab模式下运行
	}
	
	/**
	 * 检查是否为白名单的网址
	 * */
	public static function isWhiteDomain($url){
		$info = parse_url($url);
		$host = myrequest::getMainDomain();
		$whiteDomains = white_domain();
		
		if(in_array($host,$whiteDomains)){//
			return true;
		}
		
		foreach ($whiteDomains as $wDomain){ 
			$len = strlen($wDomain) + 1;
			$curHost = substr($host,-$len);
			if('.'.$wDomain == $curHost){//注意，二级子域名需要加 . 
				return true;
			}
		}
		
		return false;
	}
	
	/**
	 * 生成票据
	 * */
	public static function makeKey($src,$timestamp){
		return md5($src.'X^c&3%$5xd13X'.$timestamp.'Qci577(!@ Ub');
	}
	
	/**
	 * 检查票据是否正确
	 * 注意，当存在多台服务器的负载均衡环境下，需要同步各个服务器时间。
	 * */
	public static function checkKey($skey,$src,$timestamp,$expire=600){
		if(time()<$timestamp || $timestamp<strtotime('2012-01-01 08:00:00')){//时间不合法
			return false;
		}
		
		if((time()-$timestamp) > $expire){//时间已经过期
			return false;
		}
		
		$goodKey = self::makeKey($src,$timestamp);
		return $goodKey==$skey?true:false;
	}
	
	public static function isKeyValid(){
        if(isset($_REQUEST['key'])){
            $key = $_REQUEST['key'];
        }else{
            return false;
        }
        
        $src = self::getKeySrc();
               
        return (md5(self::$key.$str)==$key);
    }
	
	public static function getKeySrc(){
        $params = array_merge($_GET,$_POST);
        if(isset($params['key']))unset($params['key']);
        ksort($params);
         $str = '';
        foreach($params as $k=>$v){
             $str .= $k."=".$v;
        }
        return $str;
    }
    	
}
?>